gIT-Syndikat Innsbruck
gopher_rns/server.py HEAD (77dab076) Text, 8.93 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72import T7ee787RNS
Tff7b72from T7ee787. Tff7b72import Te6edf3protocol
Tff7b72from T7ee787. Tff7b72import Te6edf3utils
Te6edf3SEARCH_RESULTS_LIMIT Tff7b72= T79c0ff50
Tff7b72class T56d364GopherServerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identity_pathTb4b4b4, Te6edf3content_dirTb4b4b4, Te6edf3app_nameTff7b72=Ta5d6ff"Ta5d6ffgopherTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcontent_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffabspathTb4b4b4(Te6edf3content_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapp_name Tff7b72= Te6edf3app_name
Tff7b72selfTff7b72.Td2a8ffidentity_path Tff7b72= Te6edf3identity_path
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontent_dirTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffContent directory does not exist: Tffd700{Tff7b72selfTff7b72.Td2a8ffcontent_dirTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffreticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3require_shared_instanceTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3identity_path Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3identity_pathTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLoaded identity from Tffd700{Te6edf3identity_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3identity_pathTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffto_fileTb4b4b4(Te6edf3identity_pathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCreated new identity, saved to Tffd700{Te6edf3identity_pathTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Tff7b72selfTff7b72.Td2a8ffapp_nameTb4b4b4,
Ta5d6ff"Ta5d6ffserverTa5d6ff"
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_links Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_link_establishedTb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3dest_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffGopher server listening on Tffd700{Te6edf3dest_hashTffd700}Ta5d6ff"Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffServing content from: Tffd700{Tff7b72selfTff7b72.Td2a8ffcontent_dirTffd700}Ta5d6ff"Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDestination: Tffd700{Te6edf3dest_hashTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ff_link_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffLink established from Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3linkTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72lambda Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_handle_requestTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_closed_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_link_closedTb4b4b4)
Tff7b72def Td2a8ff_link_closedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3link Tff7b72in Tff7b72selfTff7b72.Td2a8ff_linksTb4b4b4:
Tff7b72del Tff7b72selfTff7b72.Td2a8ff_linksTb4b4b4[Te6edf3linkTb4b4b4]
Tff7b72def Td2a8ff_handle_requestTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3selectorTb4b4b4, Te6edf3query Tff7b72= Te6edf3protocolTff7b72.Td2a8ffparse_selectorTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRequest: selector=Tffd700{Te6edf3selectorTffd700!r}Ta5d6ff query=Tffd700{Te6edf3queryTffd700!r}Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3response Tff7b72= Tff7b72selfTff7b72.Td2a8ff_serveTb4b4b4(Te6edf3selectorTb4b4b4, Te6edf3queryTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_responseTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3responseTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError serving Tffd700{Te6edf3selectorTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3error_response Tff7b72= Tff7b72selfTff7b72.Td2a8ff_make_errorTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_send_responseTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3error_responseTb4b4b4)
Tff7b72def Td2a8ff_send_responseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Ta5d6ffbTa5d6ff'Ta5d6ff'Tb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72return
Tff7b72def Td2a8ffresource_concludedTb4b4b4(Te6edf3resourceTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffResource transfer completed: Tffd700{Te6edf3resourceTff7b72.Td2a8ffstatusTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3link Tff7b72in Tff7b72selfTff7b72.Td2a8ff_linksTb4b4b4:
Tff7b72del Tff7b72selfTff7b72.Td2a8ff_linksTb4b4b4[Te6edf3linkTb4b4b4]
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3callbackTff7b72=Te6edf3resource_concludedTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_linksTb4b4b4[Te6edf3linkTb4b4b4] Tff7b72= Te6edf3resource
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStarted resource transfer: Tffd700{Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tffd700}Ta5d6ff bytesTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_serveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3selectorTb4b4b4, Te6edf3queryTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Te6edf3utilsTff7b72.Td2a8ffsafe_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontent_dirTb4b4b4, Te6edf3selectorTb4b4b4)
Tff7b72if Te6edf3path Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid selector pathTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3query Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_serve_searchTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3selectorTb4b4b4, Te6edf3queryTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_serve_directoryTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3selectorTb4b4b4)
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_serve_fileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3path Tff7b72+ Ta5d6ff'Ta5d6ff.gphTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_serve_gophermapTb4b4b4(Te6edf3path Tff7b72+ Ta5d6ff'Ta5d6ff.gphTa5d6ff'Tb4b4b4, Te6edf3selectorTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149FileNotFoundErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNot found: Tffd700{Te6edf3selectorTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_serve_directoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3selectorTb4b4b4)Tb4b4b4:
Te6edf3gophermap Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff'Ta5d6ffindex.gphTa5d6ff'Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3gophermapTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_serve_gophermapTb4b4b4(Te6edf3gophermapTb4b4b4, Te6edf3selectorTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_generate_listingTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3selectorTb4b4b4)
Tff7b72def Td2a8ff_serve_gophermapTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3gophermap_pathTb4b4b4, Te6edf3base_selectorTb4b4b4)Tb4b4b4:
Te6edf3lines Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tffa657openTb4b4b4(Te6edf3gophermap_pathTb4b4b4, Ta5d6ff'Ta5d6ffrTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffreplaceTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72for Te6edf3line Tff7b72in Te6edf3fTb4b4b4:
Te6edf3parsed Tff7b72= Te6edf3protocolTff7b72.Td2a8ffparse_gophermap_lineTb4b4b4(Te6edf3lineTb4b4b4)
Tff7b72if Te6edf3parsedTb4b4b4:
Te6edf3item_typeTb4b4b4, Te6edf3displayTb4b4b4, Te6edf3selTb4b4b4, Te6edf3dest Tff7b72= Te6edf3parsed
Tff7b72if Te6edf3sel Tff7b72and Tff7b72not Te6edf3selTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3base_selectorTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3sel Tff7b72= Te6edf3base_selector Tff7b72+ Te6edf3sel
Tff7b72elseTb4b4b4:
Te6edf3sel Tff7b72= Te6edf3base_selector Tff7b72+ Ta5d6ff'Ta5d6ff/Ta5d6ff' Tff7b72+ Te6edf3sel
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(Te6edf3item_typeTb4b4b4, Te6edf3displayTb4b4b4, Te6edf3selTb4b4b4, Te6edf3destTb4b4b4)Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff.Tffea00\rTffea00\nTa5d6ff'Tb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72def Td2a8ff_generate_listingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3selectorTb4b4b4)Tb4b4b4:
Te6edf3lines Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72not Te6edf3selectorTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4)Tb4b4b4:
Te6edf3selector Tff7b72= Te6edf3selector Tff7b72+ Ta5d6ff'Ta5d6ff/Ta5d6ff'
Tff7b72if Te6edf3selector Tff7b72== Ta5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4:
Te6edf3selector Tff7b72= Ta5d6ff'Ta5d6ff'
Te6edf3entries Tff7b72= Tffa657sortedTb4b4b4(Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3entry Tff7b72in Te6edf3entriesTb4b4b4:
Tff7b72if Te6edf3entryTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff'Ta5d6ff.Ta5d6ff'Tb4b4b4) Tff7b72or Te6edf3entry Tff7b72== Ta5d6ff'Ta5d6ffindex.gphTa5d6ff'Tb4b4b4:
Tff7b72continue
Te6edf3full_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3entryTb4b4b4)
Te6edf3item_selector Tff7b72= Ta5d6ff'Ta5d6ff/Ta5d6ff' Tff7b72+ Te6edf3selectorTff7b72.Td2a8fflstripTb4b4b4(Ta5d6ff'Ta5d6ff/Ta5d6ff'Tb4b4b4) Tff7b72+ Te6edf3entry
Te6edf3item_type Tff7b72= Te6edf3utilsTff7b72.Td2a8ffdetect_item_typeTb4b4b4(Te6edf3full_pathTb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(Te6edf3item_typeTb4b4b4, Te6edf3entryTb4b4b4, Te6edf3item_selectorTb4b4b4)Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff.Tffea00\rTffea00\nTa5d6ff'Tb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72def Td2a8ff_serve_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3pathTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff'Ta5d6ff.cgiTa5d6ff'Tb4b4b4) Tff7b72or Te6edf3pathTff7b72.Td2a8ffendswithTb4b4b4(Ta5d6ff'Ta5d6ff.dcgiTa5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_execute_cgiTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff'Ta5d6ffrbTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72return Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_execute_cgiTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149PermissionErrorTb4b4b4(Ta5d6ff"Ta5d6ffCGI script not executableTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[Te6edf3pathTb4b4b4]Tb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=T79c0ff30Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3pathTb4b4b4)
Tb4b4b4)
Tff7b72return Te6edf3resultTff7b72.Td2a8ffstdout
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Tff7b72raise Tf85149TimeoutErrorTb4b4b4(Ta5d6ff"Ta5d6ffCGI script timeoutTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCGI execution failed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_serve_searchTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3selectorTb4b4b4, Te6edf3queryTb4b4b4)Tb4b4b4:
Te6edf3search_script Tff7b72= Te6edf3path Tff7b72+ Ta5d6ff'Ta5d6ff.cgiTa5d6ff'
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3search_scriptTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3search_scriptTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_execute_search_cgiTb4b4b4(Te6edf3search_scriptTb4b4b4, Te6edf3queryTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_builtin_searchTb4b4b4(Te6edf3queryTb4b4b4)
Tff7b72def Td2a8ff_execute_search_cgiTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3script_pathTb4b4b4, Te6edf3queryTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[Te6edf3script_pathTb4b4b4, Te6edf3queryTb4b4b4]Tb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=T79c0ff30Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3script_pathTb4b4b4)Tb4b4b4,
Te6edf3envTff7b72=Tb4b4b4{Tff7b72*Tff7b72*Te6edf3osTff7b72.Td2a8ffenvironTb4b4b4, Ta5d6ff'Ta5d6ffQUERYTa5d6ff'Tb4b4b4: Te6edf3queryTb4b4b4}
Tb4b4b4)
Tff7b72return Te6edf3resultTff7b72.Td2a8ffstdout
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSearch failed: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_builtin_searchTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3queryTb4b4b4)Tb4b4b4:
Te6edf3lines Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(
Te6edf3protocolTff7b72.Td2a8ffITEM_INFOTb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ffSearch results for: Tffd700{Te6edf3queryTffd700}Ta5d6ff"Tb4b4b4,
Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72None
Tb4b4b4)Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffITEM_INFOTb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4)
Te6edf3query_lower Tff7b72= Te6edf3queryTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3found Tff7b72= T79c0ff0
Tff7b72for Te6edf3rootTb4b4b4, Te6edf3dirsTb4b4b4, Te6edf3files Tff7b72in Te6edf3osTff7b72.Td2a8ffwalkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontent_dirTb4b4b4)Tb4b4b4:
Te6edf3dirsTb4b4b4[Tb4b4b4:Tb4b4b4] Tff7b72= Tb4b4b4[Te6edf3d Tff7b72for Te6edf3d Tff7b72in Te6edf3dirs Tff7b72if Tff7b72not Te6edf3dTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff'Ta5d6ff.Ta5d6ff'Tb4b4b4)Tb4b4b4]
Tff7b72for Te6edf3fname Tff7b72in Te6edf3filesTb4b4b4:
Tff7b72if Te6edf3fnameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff'Ta5d6ff.Ta5d6ff'Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3fpath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3fnameTb4b4b4)
Te6edf3item_type Tff7b72= Te6edf3utilsTff7b72.Td2a8ffdetect_item_typeTb4b4b4(Te6edf3fpathTb4b4b4)
Tff7b72if Te6edf3protocolTff7b72.Td2a8ffis_binary_typeTb4b4b4(Te6edf3item_typeTb4b4b4)Tb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3fpathTb4b4b4, Ta5d6ff'Ta5d6ffrTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff'Ta5d6ffignoreTa5d6ff'Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3content Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3query_lower Tff7b72in Te6edf3contentTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3rel_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrelpathTb4b4b4(Te6edf3fpathTb4b4b4, Tff7b72selfTff7b72.Td2a8ffcontent_dirTb4b4b4)
Te6edf3selector Tff7b72= Ta5d6ff'Ta5d6ff/Ta5d6ff' Tff7b72+ Te6edf3rel_path
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(
Te6edf3item_typeTb4b4b4, Te6edf3rel_pathTb4b4b4, Te6edf3selectorTb4b4b4, Tff7b72None
Tb4b4b4)Tb4b4b4)
Te6edf3found Tff7b72+Tff7b72= T79c0ff1
Tff7b72if Te6edf3found Tff7b72>Tff7b72= Te6edf3SEARCH_RESULTS_LIMITTb4b4b4:
Tff7b72break
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3found Tff7b72>Tff7b72= Te6edf3SEARCH_RESULTS_LIMITTb4b4b4:
Tff7b72break
Tff7b72if Te6edf3found Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(
Te6edf3protocolTff7b72.Td2a8ffITEM_INFOTb4b4b4, Ta5d6ff"Ta5d6ffNo results found.Ta5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72None
Tb4b4b4)Tb4b4b4)
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff'Ta5d6ff.Tffea00\rTffea00\nTa5d6ff'Tb4b4b4)
Tff7b72return Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Tff7b72def Td2a8ff_make_errorTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Te6edf3lines Tff7b72= Tb4b4b4[
Te6edf3protocolTff7b72.Td2a8ffformat_menu_itemTb4b4b4(Te6edf3protocolTff7b72.Td2a8ffITEM_ERRORTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffError: Tffd700{Te6edf3messageTffd700}Ta5d6ff"Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Ta5d6ff'Ta5d6ff.Tffea00\rTffea00\nTa5d6ff'
Tb4b4b4]
Tff7b72return Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4)
Served by rngit 1.5.0 - Generated in 0.06s